home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1995-09-10 | 5.8 KB | 233 lines | [TEXT/MPS ] |
- IMPLEMENTATION MODULE StackFiles;
- (* Copyright: © 1990 by Keith Nemitz, all rights reserved. *)
- FROM SYSTEM IMPORT ADR,ADDRESS;
-
- FROM Strings IMPORT Assign,Concat,MakePascalString;
-
- FROM MacTypes IMPORT OSType,OSErr,Str255;
- FROM MemoryManager IMPORT NewHandle,DisposHandle,noErr,MemError;
- FROM FileManager IMPORT HCreate,HOpen,FSClose,HDelete,
- Allocate,HRENAME,fsRdPerm,fsWrPerm; (* HRename *)
-
- FROM DataStacks IMPORT NewDataStack,DisposeDataStack,LoadDataStack,
- DataStack,DumpDataStack,dataStackErr;
-
-
- TYPE
- StackFile = POINTER TO StackFilePtr;
- StackFilePtr = POINTER TO StackFileRec;
- StackFileRec = RECORD
- fName :ARRAY [1..32] OF CHAR;
- vid :INTEGER;
- pid :LONGINT;
- stack :DataStack;
- END;
-
-
- PROCEDURE HRename(vRefNum:INTEGER; dirID:LONGINT; oldName:ARRAY OF CHAR;
- newName:ARRAY OF CHAR):OSErr;
- VAR s1,s2 :Str255;
- BEGIN
- MakePascalString(oldName,s1);
- MakePascalString(newName,s2);
- RETURN HRENAME(vRefNum,dirID,s1,s2);
- END HRename;
-
-
- PROCEDURE NewStackFile(name:ARRAY OF CHAR; volID:INTEGER; dirID:LONGINT;
-
- cSize:LONGINT; initial,grow:CARDINAL):StackFile;
- VAR
- tmpStack :DataStack;
- stkFile :StackFile;
- BEGIN
- dataStackErr := noErr;
- stkFile := NewHandle(SIZE(StackFileRec));
- IF stkFile = NIL THEN
- dataStackErr := MemError();
- RETURN NIL;
- END;
-
- tmpStack := NewDataStack(cSize,initial,grow);
- IF VAL(ADDRESS,tmpStack) = NIL THEN
- DisposHandle(stkFile);
- RETURN NIL;
- END;
-
- WITH stkFile^^ DO
- vid := volID;
- pid := dirID;
- stack := tmpStack;
- Assign(name,fName);
- END;(*with*)
-
- RETURN stkFile;
- END NewStackFile;
-
- PROCEDURE GetStackFile(name:ARRAY OF CHAR; volID:INTEGER; dirID:LONGINT):StackFile;
- VAR
- err :OSErr;
- refNum :INTEGER;
- stkFile :StackFile;
- tmpStack :DataStack;
- BEGIN
- dataStackErr := HOpen(volID,dirID,name,ORD(fsRdPerm),refNum);
- IF dataStackErr # 0 THEN RETURN NIL; END;
-
- tmpStack := LoadDataStack(refNum);
- err := FSClose(refNum); (* what to do if close should fail??? *)
- IF VAL(ADDRESS,tmpStack) = NIL THEN RETURN NIL; END;
-
- stkFile := NewHandle(SIZE(StackFileRec));
- IF stkFile = NIL THEN
- dataStackErr := MemError();
- RETURN NIL;
- END;
-
- WITH stkFile^^ DO
- vid := volID;
- pid := dirID;
- stack := tmpStack;
- Assign(name,fName);
- END;(*with*)
-
- RETURN stkFile;
- END GetStackFile;
-
-
- PROCEDURE SaveStackFile(sFile:StackFile);
- VAR
- err :OSErr;
- count :LONGINT;
- refNum :INTEGER;
- str1,str2 :Str255;
- stkFRec :StackFileRec;
- BEGIN
- dataStackErr := noErr;
-
- (* free space on disk is verified in DumpStack. It will return
- and propagate the allocation error message if DumpStack could not
- find enough free space for current volume. *)
-
- stkFRec := sFile^^;
- WITH stkFRec DO
- Concat(fName,".saved",str1);
- Concat(fName,".temp",str2);
-
- err := HRename(vid,pid,str1,str2); (* rename saved to temp. *)
- IF NOT ((err = 0) OR (err = -37) OR (err = -43)) THEN
- dataStackErr := err;
- RETURN;
- END;
- err := HRename(vid,pid,fName,str1); (* rename file to saved. *)
- IF NOT ((err = 0) OR (err = -37) OR (err = -43)) THEN
- dataStackErr := err;
- RETURN;
- END;
-
- dataStackErr := HCreate(vid,pid,fName,'????','DECK');
- IF dataStackErr # 0 THEN
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
-
- dataStackErr := HOpen(vid,pid,fName,ORD(fsWrPerm),refNum);
- IF dataStackErr # 0 THEN
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
-
- IF DumpDataStack(stack,refNum) THEN
- err := FSClose(refNum);
- err := HDelete(vid,pid,str2); (* delete temp file *)
- RETURN;
- ELSE
- err := FSClose(refNum);
- err := HDelete(vid,pid,fName); (* delete attempted file. *)
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
- END;(*with*)
- END SaveStackFile;
-
- PROCEDURE CloseStackFile(sFile:StackFile);
- BEGIN
- DisposeDataStack(sFile^^.stack);
- DisposHandle(sFile);
- END CloseStackFile;
-
-
- PROCEDURE GetDataStack(sFile:StackFile):DataStack;
- BEGIN
- RETURN VAL(ADDRESS,sFile^^.stack);
- END GetDataStack;
-
-
- END StackFiles.
-
-
-
-
- (*
- dataStackErr := noErr;
-
- (* free space on disk is verified in DumpStack. It will return
- and propagate the allocation error message if DumpStack could not
- find enough free space for current volume. *)
-
- stkFRec := sFile^^;
- WITH stkFRec DO
- IF NOT save THEN
- DisposeDataStack(stack);
- DisposHandle(sFile);
- RETURN;
- END;
-
- Concat(fName,".saved",str1);
- Concat(fName,".temp",str2);
-
- err := HRename(vid,pid,str1,str2); (* rename saved to temp. *)
- IF NOT ((err = 0) OR (err = -37) OR (err = -43)) THEN
- dataStackErr := err;
- RETURN;
- END;
- err := HRename(vid,pid,fName,str1); (* rename file to saved. *)
- IF NOT ((err = 0) OR (err = -37) OR (err = -43)) THEN
- dataStackErr := err;
- RETURN;
- END;
-
- dataStackErr := HCreate(vid,pid,fName,'????','DECK');
- IF dataStackErr # 0 THEN
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
-
- dataStackErr := HOpen(vid,pid,fName,ORD(fsWrPerm),refNum);
- IF dataStackErr # 0 THEN
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
-
- IF DumpDataStack(stack,refNum) THEN
- err := FSClose(refNum);
- err := HDelete(vid,pid,str2); (* delete temp file *)
- DisposeDataStack(stack);
- DisposHandle(sFile);
- RETURN;
- ELSE
- err := FSClose(refNum);
- err := HDelete(vid,pid,fName); (* delete attempted file. *)
- err := HRename(vid,pid,str1,fName); (* rename saved back to file. *)
- err := HRename(vid,pid,str2,str1); (* rename temp back to saved. *)
- RETURN;
- END;
- END;(*with*)
- *)
-
-